package com.bit.demo4;


//将异常用try..catch..finally处理起来，是其他代码能够正常运行！！如果不处理就会把异常交给JVM处理，程序立马就会终止！
public class JAVAException {
    public static void main1(String[] args) {
        /*int[] array = {1,2,3};
        System.out.println(array[5]);
        System.out.println("hello");程序出现异常，后续代码执行不了*/

        int[] array = {1, 2, 3};

        //try 代码块中放的是可能出现异常的代码
        try {
            array = null;
            System.out.println(array[5]);
            System.out.println("haha");//打印不了
        }
        //catch 代码块中放的是出现异常后的处理行为
        //catch在捕获异常时，从上往下最好是由子类到父类
        catch (ArrayIndexOutOfBoundsException e) {//如果捕捉到的异常与catch中的处理不匹配就会将异常交给JVM，程序立马终止！
            e.printStackTrace();
            System.out.println("我捕捉到了一个异常,这里开始处理异常了");
        } catch (NullPointerException e) {
            e.printStackTrace();//打印异常位置所在
            System.out.println("我捕捉到了一个空指针异常，这里开始处理异常了！");
        }
        //finally 代码块中的代码用于处理善后工作, 会在最后执行
        //不管有没有异常，finally都将会执行！所以尽量避免在finally中写return
        //finally 执行的时机是在方法返回之前(try 或者 catch 中如果有 return 会在这个 return 之前执行 finally). 但是如果
        //finally 中也存在 return 语句, 那么就会执行 finally 中的 return, 从而不会执行到 try 中原有的 return.
        finally {

        }
        System.out.println("hello");
    }


    //调用的函数抛出异常
   /* public static void func(int n) throws ArithmeticException {
        System.out.println(10 / n);
    }

    public static void main2(String[] args) {
        try {
            func(0);
        }
        catch (ArithmeticException e){
            e.printStackTrace();
            System.out.println("这里检测到语法错误！");
        }
        finally {

        }
    }*/


    //throws  声明这个函数可能会抛出此异常,通常与throw一起用
   /* public static int func1(int x) throws ArithmeticException {
        if (x == 0) {
            //System.out.println(10 / x); 已经抛异常了，后面不会再执行
            //抛出自定义异常,我们可以根据实际情况来抛出需要的异常. 在构造异常对象同时可以指定一些描述性信息
            throw new ArithmeticException("x!=0");
        }
        return 10 / x;
    }

    public static void main3(String[] args) {
        try {
            func1(0);
        }
        catch (ArithmeticException e){
            e.printStackTrace();
            System.out.println("这里有算法异常！");
        }
        finally {

        }
    }*/


    // 如果本方法中没有合适的处理异常的方式, 就会沿着调用栈向上传递
    /*public static void main4(String[] args) {
        try {
            func();
        } catch (ArrayIndexOutOfBoundsException e) {
            e.printStackTrace();
        }
        System.out.println("after try catch");
    }

    public static void func() {
        int[] arr = {1, 2, 3};
        System.out.println(arr[100]);
    }*/


    public static void main15(String[] args) {
        int i = 0;
        while (i < 10) {
            try {
                if (i < 10) {
                    throw new Exception();
                }
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("尝试连接网络" + i + "次.............");
                i++;
            }
        }
        System.out.println("终于有网了，程序继续执行！！！！！！！！！！！");
    }


    //====================================================================================
    private static String userName = "admin";
    private static String password = "123456";

    //自定义异常
    //继承自 Exception 的异常默认是受查异常，此时必须显示进行处理（1.try catch包裹异常 2.方法上加上异常说明）
    //继承自 RuntimeException 的异常默认是非受查异常
    static class UserError extends Exception {
        public UserError(String message) {
            super(message);
        }
    }

    static class PasswordError extends Exception {
        public PasswordError(String message) {
            super(message);
        }
    }

    public static void login(String userName, String password) throws UserError, PasswordError {
        if (!JAVAException.userName.equals(userName)) {
            throw new UserError("用户名错误");
        }
        if (!JAVAException.password.equals(password)) {
            throw new PasswordError("密码错误");
        }
        System.out.println("登陆成功");
    }

    public static void main6(String[] args) {
        try {
            login("admin", "1233456");
        } catch (UserError userError) {
            userError.printStackTrace();
        } catch (PasswordError passwordError) {
            passwordError.printStackTrace();
        } finally {

        }
    }


    public static void main(String[] args) {
        children ch = new children();
    }
}

class parents {
//        public String  name;
//        public int age;

//    public parents(){
//        //this.name = name;
//    }
}

class children extends parents {
//    public children() {
//        //super();
//        System.out.println("hello tanchen");
//    }
}

